package base.ioput;

/*
字符流和字节流：

    字节流  两个基类：InputStream   OutputStream        byte Stream

    字符流  两个基类：Reader Writer                     file Stream

字符流的特点:
    既然IO流是用于操作数据的，  byte
    那么数据的最常见体现形式是：文件。


需求:在硬盘上，创建一个文件并写入一些文字数据。
    找到一个专门用于操作文件的Writer子类对象。
    FileWriter。  后缀名是父类名。 前缀名是该流对象的功能。
*/

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;



class FileWriterDemo {
    public static void main(String[] args) throws IOException {
        //创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
        //而且该文件会被创建到指定目录下。如果该目录下已有同名文件，将被覆盖。
        //其实该步就是在明确数据要存放的目的地。
        FileWriter fw = new FileWriter("demo.txt");//路径不是绝对的，有歧义要抛

        //调用write方法，将字符串写入到流中。write方法的可能的异常在于写入的时候可能没注意到写入数据的大小使硬盘的大小不够
        fw.write("abcde");

        //刷新流对象中的缓冲中的数据。
        //将数据刷到目的地中。
        //fw.flush();


        //关闭流资源，但是关闭之前会刷新一次内部的缓冲中的数据。
        //将数据刷到目的地中。
        //和flush区别：flush刷新后，流可以继续使用，close刷新后，会将流关闭，关闭后将不能再向流中加入内容。
        fw.close();    //java靠调用系统的功能进行写入数据，java本身不能写数据（依靠的系统平台的），调用的资源要关
    }


    /*
        IO异常的处理方式。
        一般调用系统的功能都会出现一些异常，所以要注意
    */
    public static void ioputExecption() {
        FileWriter fw = null;//如果在try内定义，别的地方将访问不到fw
        try {
            fw = new FileWriter("demo.txt");//进行初始化
            fw.write("abcdefg");

        } catch (IOException e) {
            System.out.println("catch:" + e.toString());
        } finally {
            try {
                if (fw != null)     //fw为空不能调close（），为了代码的健壮性所有要进行判定是否为空
                    fw.close();    //关流动作一定要关的
            } catch (IOException e) {
                System.out.println(e.toString());
            }

        }

    }

    public static void writeFile() throws IOException {
        //传递一个true参数，代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
        FileWriter fw = new FileWriter("demo.txt", true);//建立数据存放的目的地

        fw.write("nihao\r\nxiexie");//要续写的内容，其中\r\n是换行符

        fw.close();
    }


    public static void readFile() throws IOException {
        //创建一个文件读取流对象，和指定名称的文件相关联。
        //要保证该文件是已经存在的，如果不存在，会发生异常FileNotFoundException
        FileReader fr = new FileReader("demo.txt");

        //调用读取流对象的read方法。
        //read():一次读一个字符。而且会自动往下读。

        int ch = 0;

        while ((ch = fr.read()) != -1) {
            System.out.println((char) ch);
        }

		/*
		while(true){
			int ch = fr.read();	//一次只能读取一个
			if(ch==-1)	break;	//在读取时读到末尾时会返回-1，这个特性
			System.out.println("ch="+(char)ch);//如果不强转返回的是一个数字
		}
		*/

        fr.close();
    }

    public static void bufferReadFile() throws IOException {
        FileReader fr = new FileReader("demo.txt");

        //定义一个字符数组。用于存储读到字符。
        //该read(char[])返回的是读到字符个数。
        char[] buf = new char[1024];

        /*
            char[] buf=new char[3];
            int num=fr.read(buf);//把流里的数据读一个然后存到数组里
            System.out.println(num+"..."new String(buf) );
            这个结果是3...abc,这数组就3个长度，只能读3个
		*/

        int num = 0;
        while ((num = fr.read(buf)) != -1) {
            System.out.println(new String(buf, 0, num));//读几个打几个
        }

        fr.close();
    }


}
